﻿//using System.Collections.Immutable;
//using System.Linq;
//using System.Threading;
//using Microsoft.CodeAnalysis;
//using Microsoft.CodeAnalysis.CSharp;
//using Microsoft.CodeAnalysis.CSharp.Syntax;
//using Microsoft.CodeAnalysis.Diagnostics;
//using UIOC.CodeAnalysis.Helpers;

//namespace UIOC.CodeAnalysis.Suppressors;

//[DiagnosticAnalyzer(LanguageNames.CSharp)]
//internal sealed class GeneratedInheritanceConflictSuppressor : DiagnosticSuppressor {

//    private static void LogInfo(string message) {
//        SourceOutputHelper.LogInfoToSourceGenLog(DiagnosticSeverity.Info, $"[{nameof(GeneratedInheritanceConflictSuppressor)}] {message}");
//    }

//    // 要抑制的错误码（CS0263：部分类不能有不同的基类）
//    private static readonly SuppressionDescriptor SuppressDescriptor = new(
//        id: "SPDCS0263",
//        suppressedDiagnosticId: "CS0263",
//        justification: "生成代码与用户代码的基类冲突，编译后会自动解决"
//    );

//    public override ImmutableArray<SuppressionDescriptor> SupportedSuppressions =>
//        ImmutableArray.Create(SuppressDescriptor);

//    public override void ReportSuppressions(SuppressionAnalysisContext context) {
//        foreach (var diagnostic in context.ReportedDiagnostics) {
//            if (diagnostic.Id != "CS0263")
//                continue;

//            if (IsGeneratedAndUserPartialClassConflict(diagnostic.Location.SourceTree, context.CancellationToken)) {
//                LogInfo("生成代码与用户代码的基类冲突，编译后会自动解决");
//                context.ReportSuppression(Suppression.Create(SuppressDescriptor, diagnostic));
//            }
//        }
//    }

//    // 判断是否是生成代码与用户代码的partial类基类冲突
//    private bool IsGeneratedAndUserPartialClassConflict(SyntaxTree tree, CancellationToken cancellationToken) {
//        if (tree == null)
//            return false;

//        // 1. 解析语法树，找到所有partial类声明
//        var root = tree.GetRoot(cancellationToken);
//        var classDeclarations = root.DescendantNodes()
//            .OfType<ClassDeclarationSyntax>()
//            .Where(c => c.Modifiers.Any(m => m.IsKind(SyntaxKind.PartialKeyword)))
//            .ToList();

//        if (classDeclarations.Count == 0)
//            return false;

//        // 2. 检查是否有部分类在生成的文件中（含<auto-generated>注释）
//        bool hasGeneratedPartial = IsGeneratedFile(tree) && classDeclarations.Any();

//        // 3. 检查是否有部分类在用户代码中（非生成文件）
//        // （通过其他语法树判断，这里简化为：当前文件是用户代码，且存在其他partial类）
//        bool hasUserPartial = !IsGeneratedFile(tree) && classDeclarations.Any();

//        // 4. 检查基类是否为冲突的特定类型（生成代码继承UIOC.Object，用户代码继承AbstructObject）
//        bool hasConflictingBases = classDeclarations
//            .SelectMany(c => c.BaseList?.Types ?? Enumerable.Empty<BaseTypeSyntax>())
//            .Select(t => t.Type.ToString())
//            .Distinct()
//            .Count() > 1; // 存在不同的基类

//        return hasGeneratedPartial && hasUserPartial && hasConflictingBases;
//    }

//    // 判断文件是否为生成的代码（含<auto-generated>注释）
//    private bool IsGeneratedFile(SyntaxTree tree) {
//        var root = tree.GetRoot();
//        var firstToken = root.GetFirstToken();
//        if (firstToken.HasLeadingTrivia) {
//            // 检查是否有<auto-generated>注释
//            var commentTrivia = firstToken.LeadingTrivia
//                .OfType<DocumentationCommentTriviaSyntax>()
//                .FirstOrDefault();

//            if (commentTrivia != null) {
//                string commentText = commentTrivia.ToFullString();
//                return commentText.Contains("<auto-generated>") &&
//                       commentText.Contains("UIOCGenerator"); // 匹配特定生成器
//            }
//        }
//        return false;
//    }
//}
